/*
	author: TangQiao , Wind @ Beijing Normal University

	problem name: Decode the Tree

	
	source : BNU Online Judge
	
	problem type: 递归处理题
	
	problem description: 给你一个树(其实也可以说是图),每次删除一个只有一个点与之相连的点,如果有多个的话按从
			    小到大删,删除后输出与这个点相连的那个点.
			    题目按此方法算出输出的内容,要求你求出那个树.
	
	
	faults: 主要是因为可以输入的序列为空,也就是只有一个空行.对于这种情况特殊处理,其它都好办.
	
	date : 2005.7.29 北师大个人练习赛13
	
*/

#include <stdio.h>
#include <string.h>
#include <math.h>

int queue[100];
int qn;
int map[55][55];
int used[55];
int n;

void check()
{
	int i,j;
	for (i=1;i<=n;i++)
	{
		for (j=1;j<=n;j++)
			printf("%d", map[i][j]);
		printf("\n");
	}
}

void output(int nod)
{
	int i;
	printf("(%d",nod);
	if (map[nod][0]==0)
		printf(")");
	else
	{
		for (i=1;i<=n;i++)
			if (map[nod][i]==1)
			{
				map[nod][i]=map[i][nod]=0;
				map[nod][0]--;
				map[i][0]--;
				printf(" ");
				output(i);
			}
		printf(")");
	}
	
}

main()
{
	char ch,a,ch2;
	int i,j,k,tot;
	int sign;
	
	while (scanf("%c", &ch)!=EOF)
	{
		if (ch=='\n') 
		{
			printf("(1)\n");
			continue;
		}
		else
		{
			ch2=ch;
			scanf("%c", &ch);
			if (ch>='0' && ch<='9') 
			{
				a=(ch2-'0')*10+ch-'0';
				sign=1;
			}
			else 
			{
				a=ch2-'0';
				sign=2;
			}
		}
		memset(queue,0,sizeof(queue));
		memset(map,0,sizeof(map));
		memset(used,0,sizeof(used));
		qn=0;
		queue[++qn]=a;

		
		if (sign==1) scanf("%c", &ch);
		while (ch!='\n')
		{
			scanf("%d%c", &a, &ch);
			queue[++qn]=a;
		}		
		n=qn+1;
		for (i=1;i<=qn;i++)
		{
			used[queue[i]]++;
		}

		for (k=1;k<=qn;k++)
		{
			for (i=1;i<=n;i++)
				if (used[i]==0)
					break;
			used[i]--;
			used[queue[k]]--;
			map[i][queue[k]]=map[queue[k]][i]=1;
		}
//		check();
		for (i=1;i<=n;i++)
		{
			tot=0;
			for (j=1;j<=n;j++)
				tot+=map[i][j];
			map[i][0]=tot;
		}
			
		output(n);
		printf("\n");



	}

	return 0;
}